package org.ytor.core.sqlflow.builder.select;

import org.ytor.core.sqlflow.builder.support.JoinOnBuilder;
import org.ytor.core.sqlflow.builder.support.WhereBuilder;
import org.ytor.core.sqlflow.SFunction;

import java.util.function.Consumer;

/**
 * created by yangtong on 2025/8/11 10:06:45
 * <br/>
 * FROM 阶段：
 * 允许：JOIN / WHERE / GROUP BY / ORDER BY / LIMIT / OFFSET / 终止
 * 一旦进入 ORDER/LIMIT/OFFSET，则不再允许 JOIN/WHERE（由返回类型限制）
 */
public interface FromStage extends Terminable, OrderStage, ISelect {

    /**
     * 左连接, 自动推断连接表的别名
     */
    FromStage leftJoin(Class<?> joinTable, Consumer<JoinOnBuilder> on);

    /**
     * 左连接, 手动指定连接表的别名
     */
    FromStage leftJoin(Class<?> joinTable, String alias, Consumer<JoinOnBuilder> on);

    /**
     * 左连接, 使用子查询的结果作为连接表
     */
    FromStage leftJoin(ISelect subSelect, String alias, Consumer<JoinOnBuilder> on);

    /**
     * 右连接, 自动推断连接表的别名
     */
    FromStage rightJoin(Class<?> joinTable, Consumer<JoinOnBuilder> on);

    /**
     * 右连接, 手动指定连接表的别名
     */
    FromStage rightJoin(Class<?> joinTable, String alias, Consumer<JoinOnBuilder> on);

    /**
     * 右连接, 使用子查询的结果作为连接表
     */
    FromStage rightJoin(ISelect subSelect, String alias, Consumer<JoinOnBuilder> on);

    /**
     * 内连接, 自动推断连接表的别名
     */
    FromStage innerJoin(Class<?> joinTable, Consumer<JoinOnBuilder> on);

    /**
     * 内连接, 手动指定连接表的别名
     */
    FromStage innerJoin(Class<?> joinTable, String alias, Consumer<JoinOnBuilder> on);

    /**
     * 内连接, 使用子查询的结果作为连接表
     */
    FromStage innerJoin(ISelect subSelect, String alias, Consumer<JoinOnBuilder> on);

    /**
     * 进入 WHERE 阶段
     */
    WhereStage where(Consumer<WhereBuilder> c);

    /**
     * 进入 WHERE 阶段
     */
    WhereStage where(WhereBuilder where);

    /**
     * 进入 GROUP BY 阶段
     */
    <T>GroupByStage groupBy(SFunction<T, ?> fields);

    /**
     * 进入 GROUP BY 阶段（原生片段）
     */
    GroupByStage groupByRaw(String... raw);
}
